﻿using System;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using System.Security.Principal;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
using System.Web.Security;
using PcaWeb.Models;
using Ext.Net;
using Ext.Net.MVC;
using PcaCore.BOL.Pca;
using PcaCore.DAL.Pca;
using PcaCore.DAL.Log;
using PcaCore.BOL.Log;

namespace PcaWeb.Controllers
{
    public class AccountController : Controller
    {
        public IFormsAuthenticationService FormsService { get; set; }
        public IAccountMembershipService MembershipService { get; set; }

        protected override void Initialize(RequestContext requestContext)
        {
            if (FormsService == null) { FormsService = new FormsAuthenticationService(); }
            if (MembershipService == null) { MembershipService = new AccountMembershipService(); }

            base.Initialize(requestContext);
        }

        private JsonResult GetErrorLogin(string userName)
        {
            MembershipUser usrInfo = Membership.GetUser(userName);

            if (usrInfo != null)
            {
                if (usrInfo.IsLockedOut)
                    return Json(new { success = false, msg = "Su cuenta ha sido bloqueada debido a demasiados intentos de inicio de sesión no válidos. Por favor, póngase en contacto con el administrador para que su cuenta sea desbloqueada." });
                else
                {
                    if (!usrInfo.IsApproved)
                        return Json(new { success = false, msg = "Su cuenta aún no ha sido aprobado no se puede iniciar sesión hasta que un administrador ha aprobado su cuenta." });
                }
            }
            return Json(new { success = false, msg = "El nombre de usuario o la contraseña especificados son incorrectos." });
        }

        #region URL: /Account/Login

        public ActionResult Login(string ReturnUrl)
        {
            if (Membership.GetUser() != null && !string.IsNullOrEmpty(ReturnUrl))
            {
                return RedirectToAction("NoAutorizado");
            }
            else
            {
                ViewBag.returnUrl = ReturnUrl;
                return View();
            }
        }

        [HttpPost]
        public ActionResult Login(LogOnModel model, string ReturnUrl)
        {
            if (ModelState.IsValid)
            {
                if (MembershipService.ValidateUser(model.UserName, model.Password))
                {
                    FormsService.SignIn(model.UserName, false);

                    if (Url.IsLocalUrl(ReturnUrl))
                    {
                        return Redirect(ReturnUrl);
                    }
                    else
                    {
                        return RedirectToAction("Index", "Home", new { area = "Admin" });
                    }
                }
                else
                {
                    return GetErrorLogin(model.UserName);
                }
            }
            else
            {
                return Json(new { success = false, msg = "No se envio la informacion correctamente" });
            }
        }

        #endregion

        #region URL: /Account/NoAutorizado

        public ActionResult NoAutorizado()
        {
            return View();
        }

        #endregion

        #region URL: /Account/LogOff

        public ActionResult LogOff(string ReturnUrl)
        {
            FormsService.SignOut();
            System.Web.HttpContext.Current.Session.Clear();

            HttpCookie aCookie;
            string cookieName;
            int limit = HttpContext.Request.Cookies.Count;
            for (int i = 0; i < limit; i++)
            {
                cookieName = HttpContext.Request.Cookies[i].Name;
                aCookie = new HttpCookie(cookieName);
                aCookie.Expires = DateTime.Now.AddDays(-1);
                HttpContext.Response.Cookies.Add(aCookie);
            }

            if (Url.IsLocalUrl(ReturnUrl))
            {
                return Redirect(ReturnUrl);
            }
            else
            {
                return RedirectToAction("Index", "Home");
            }
        }

        #endregion

        #region URL: /Account/CambiarClave

        [Authorize]
        public Ext.Net.MVC.PartialViewResult FrmCambiarClave()
        {
            return new Ext.Net.MVC.PartialViewResult
            {
                ViewName = "FrmCambiarClave"
            };
        }

        [Authorize]
        [HttpPost]
        public ActionResult CambiarClave(ChangePasswordModel model)
        {
            if (ModelState.IsValid)
            {
                if (MembershipService.ChangePassword(User.Identity.Name, model.OldPassword, model.NewPassword))
                    return Json(new { success = true });
                else
                    return Json(new { success = false, msg = "La contraseña actual es incorrecta o la nueva contraseña no es válida." });
            }
            return Json(new { success = false, msg = "No se envio informacion correctamente." });
        }

        #endregion

        #region Login para usuarios donde se necesita seleccionar empresa y oficina

        public Ext.Net.MVC.PartialViewResult FrmSeleccionarOficina(LogOnModel model, List<oVwUsuarioEmpresa> oficinasAsignadas, string ReturnUrl)
        {
            ViewBag.returnUrl = ReturnUrl;
            ViewBag.UserName = model.UserName;
            ViewBag.Password = model.Password;
            ViewBag.oficinasAsignadas = oficinasAsignadas;

            return new Ext.Net.MVC.PartialViewResult
            {
                ViewName = "FrmSeleccionarOficina",
                ViewData = ViewData
            };
        }

        public ActionResult LoginEmpresa(string ReturnUrl)
        {
            if (Membership.GetUser() != null && dSesion.GetId() != 0 && !string.IsNullOrEmpty(ReturnUrl))
            {
                return RedirectToAction("NoAutorizado");
            }
            else
            {
                //ViewBag.returnUrl = ReturnUrl;
                ViewBag.returnUrl = Url.Action("Index", "Home", new { area = "" }); 
                return View();
            }
        }

        public ActionResult GetListOficinas(string empresaId, string userName)
        {
            string usuarioId = MembershipService.Get(userName).ProviderUserKey.ToString();
            List<oVwUsuarioEmpresa> oficinas = dUsuario.GetListOficinas(usuarioId, empresaId);
            return this.Store(oficinas, oficinas.Count);
        }

        [HttpPost]
        public ActionResult ConsultarOficinas(LogOnModel model, string ReturnUrl)
        {
            try
            {
                if (ModelState.IsValid)
                {
                    if (MembershipService.ValidateUser(model.UserName, model.Password))
                    {
                        //Consultamos las oficinas en las que tiene permiso
                        string usuarioId = MembershipService.Get(model.UserName).ProviderUserKey.ToString();
                        List<oVwUsuarioEmpresa> empresas = dUsuario.GetListEmpresas(usuarioId);
                        List<oVwUsuarioEmpresa> oficinas = null;
                        if (empresas.Count > 0)
                        {
                            if (empresas.Count == 1)
                            {
                                oficinas = dUsuario.GetListOficinas(usuarioId, empresas[0].empresa_id);

                                if (oficinas.Count == 1)
                                {
                                    //Registramos sesion
                                    dSesion.Insert(oficinas[0].empresa_id, oficinas[0].oficina_id, usuarioId, Request.UserHostAddress);

                                    FormsService.SignIn(model.UserName, true);

                                    if (Url.IsLocalUrl(ReturnUrl))
                                    {
                                        return Redirect(ReturnUrl);
                                    }
                                    else
                                    {
                                        return RedirectToAction("Index", "Home");
                                    }
                                }
                            }

                            return FrmSeleccionarOficina(model, empresas, ReturnUrl);
                        }
                        else
                        {
                            return Json(new { success = false, msg = "No tiene asignado ninguna empresa-oficina, consulte al administrador" });
                        }
                    }
                    else
                    {
                        return GetErrorLogin(model.UserName);
                    }
                }
                else
                {
                    return Json(new { success = false, msg = "No se envio la informacion correctamente" });
                }
            }
            catch (Exception ex)
            {
                return Json(new { success = false, msg = ex.Message });
            }
        }

        [HttpPost]
        public ActionResult LoginEmpresa(LogOnEmpresaModel model, string ReturnUrl)
        {
            try
            {
                if (ModelState.IsValid)
                {
                    if (MembershipService.ValidateUser(model.UserName, model.Password))
                    {
                        string usuarioId = MembershipService.Get(model.UserName).ProviderUserKey.ToString();

                        //Registramos sesion
                        dSesion.Insert(model.Empresa, model.Oficina, usuarioId, Request.UserHostAddress);

                        FormsService.SignIn(model.UserName, true);

                        if (Url.IsLocalUrl(ReturnUrl))
                        {
                            return Redirect(ReturnUrl);
                        }
                        else
                        {
                            return RedirectToAction("Index", "Home", new { area = "" });
                        }
                    }
                    else
                    {
                        return GetErrorLogin(model.UserName);
                    }
                }
                else
                {
                    return Json(new { success = false, msg = "No se envio la informacion correctamente" });
                }
            }
            catch (Exception ex)
            {
                return Json(new { success = false, msg = ex.Message });
            }
        }


        #endregion
    }
}
